/**
 * 字段映射工具
 * 将Java对象字段名映射为中文显示名
 */

// 基础字段映射
const baseFieldMap = {
  // 通用结果字段
  'result': '结果',
  'status': '状态',
  'state': '状态',

  // CCD相关
  'ccdResult': 'CCD检测结果',
  'ccdCheck': 'CCD检查',
  'camera': '相机',
  'cameraResult': '相机检测结果',

  // 螺丝相关
  'screw': '螺丝',
  'tighten': '拧紧',
  'torque': '扭矩',
  'angle': '角度',
  'program': '程序',
  'batch': '批次',
  'min': '最小',
  'max': '最大',
  'act': '实际',
  'actual': '实际',

  // 测试相关
  'test': '测试',
  'resistance': '电阻',
  'dielectric': '绝缘电阻',
  'voltage': '电压',
  'height': '高度',

  // 物料相关
  'driverBoard': '驱动板',
  'material': '物料',
  'part': '零件',
  'load': '上料',
  'place': '放置',

  // 涂胶相关
  'glue': '涂胶',
  'width': '宽度',
  'average': '平均',
  'start': '交叠区',
  'housing': '壳体',
  'controller': '主控板',
  'phase': '三相盖板',
  'wire': '线束',
  'busbar': '母线',

  // 清洗相关
  'plasma': '等离子清洗',
  'clean': '清洗',

  // 其他
  'no': '号',
  'code': '码',
  'number': '编号',
  'sealingRing': '密封圈批次号'
}

// 特殊字段完整映射
const specialFieldMap = {
  // 螺丝CCD检查
  'screwCCDcheckResult': '螺丝相机检查结果',
  'screwCCDResult': '螺丝相机检查结果',

  // 拧紧结果
  'tightenResult01': '1#螺丝拧紧结果',
  'tightenResult02': '2#螺丝拧紧结果',
  'tightenResult03': '3#螺丝拧紧结果',
  'tightenResult04': '4#螺丝拧紧结果',
  'tightenResult05': '5#螺丝拧紧结果',
  'tightenResult06': '6#螺丝拧紧结果',
  'tightenResult07': '7#螺丝拧紧结果',
  'tightenResult08': '8#螺丝拧紧结果',
  'tightenResult09': '9#螺丝拧紧结果',
  'tightenResult10': '10#螺丝拧紧结果',
  'tightenResult11': '11#螺丝拧紧结果',
  'tightenResult12': '12#螺丝拧紧结果',

  // 批次号
  'screwBatchNo': '螺丝批次号',
  'screwBtachNo': '螺丝批次号', // 拼写错误的字段名
  'glueBatchNo': '胶水批次号',

  // 物料码
  'adapterBoardMaterialNo': '转接板追溯码',
  'housingMaterialNo': '壳体追溯码',
  'controllerMaterialNo': '主控板追溯码',
  'controllerBoardMaterialNo': '主控板盖板追溯码',
  'phaseMaterialNo': '三相盖板追溯码',
  'wireMaterialNo': '低压线束追溯码',
  'busbarMaterialNo': '母线盖板追溯码',
  'thinFilmCapacitorMaterialNo': '薄膜电容追溯码',
  'filterCapacitorMaterialNo': '滤波组件追溯码',
  'driverBoardMaterialNo': '驱动板追溯码',
  'driverCoverMaterialNo': '驱动盖板追溯码',

  // 程序号
  'programNo01': '1#螺丝拧紧程序号',
  'programNo02': '2#螺丝拧紧程序号',
  'programNo03': '3#螺丝拧紧程序号',
  'programNo04': '4#螺丝拧紧程序号',
  'programNo05': '5#螺丝拧紧程序号',
  'programNo06': '6#螺丝拧紧程序号',
  'programNo07': '7#螺丝拧紧程序号',
  'programNo08': '8#螺丝拧紧程序号',
  'programNo09': '9#螺丝拧紧程序号',
  'programNo10': '10#螺丝拧紧程序号',
  'programNo11': '11#螺丝拧紧程序号',
  'programNo12': '12#螺丝拧紧程序号',
  'testProgramNo': '测试程序号',

  // 扭矩
  'minTorque01': '1#螺丝拧紧最小扭矩',
  'actTorque01': '1#螺丝拧紧最终扭矩',
  'maxTorque01': '1#螺丝拧紧最大扭矩',
  'minTorque02': '2#螺丝拧紧最小扭矩',
  'actTorque02': '2#螺丝拧紧最终扭矩',
  'maxTorque02': '2#螺丝拧紧最大扭矩',
  'minTorque03': '3#螺丝拧紧最小扭矩',
  'actTorque03': '3#螺丝拧紧最终扭矩',
  'maxTorque03': '3#螺丝拧紧最大扭矩',
  'minTorque04': '4#螺丝拧紧最小扭矩',
  'actTorque04': '4#螺丝拧紧最终扭矩',
  'maxTorque04': '4#螺丝拧紧最大扭矩',
  'minTorque05': '5#螺丝拧紧最小扭矩',
  'actTorque05': '5#螺丝拧紧最终扭矩',
  'maxTorque05': '5#螺丝拧紧最大扭矩',
  'minTorque06': '6#螺丝拧紧最小扭矩',
  'actTorque06': '6#螺丝拧紧最终扭矩',
  'maxTorque06': '6#螺丝拧紧最大扭矩',

  'minTorque07': '7#螺丝拧紧最小扭矩',
  'actTorque07': '7#螺丝拧紧最终扭矩',
  'maxTorque07': '7#螺丝拧紧最大扭矩',

  'minTorque08': '8#螺丝拧紧最小扭矩',
  'actTorque08': '8#螺丝拧紧最终扭矩',
  'maxTorque08': '8#螺丝拧紧最大扭矩',


  'minTorque09': '9#螺丝拧紧最小扭矩',
  'actTorque09': '9#螺丝拧紧最终扭矩',
  'maxTorque09': '9#螺丝拧紧最大扭矩',

  'minTorque10': '10#螺丝拧紧最小扭矩',
  'actTorque10': '10#螺丝拧紧最终扭矩',
  'maxTorque10': '10#螺丝拧紧最大扭矩',

  'minTorque11': '11#螺丝拧紧最小扭矩',
  'actTorque11': '11#螺丝拧紧最终扭矩',
  'maxTorque11': '11#螺丝拧紧最大扭矩',
  'minTorque12': '12#螺丝拧紧最小扭矩',
  'actTorque12': '12#螺丝拧紧最终扭矩',
  'maxTorque12': '12#螺丝拧紧最大扭矩',

  // 角度
  'minAngle01': '1#螺丝拧紧最小角度',
  'actAngle01': '1#螺丝拧紧最终角度',
  'maxAngle01': '1#螺丝拧紧最大角度',
  'minAngle02': '2#螺丝拧紧最小角度',
  'actAngle02': '2#螺丝拧紧最终角度',
  'maxAngle02': '2#螺丝拧紧最大角度',
  'minAngle03': '3#螺丝拧紧最小角度',
  'actAngle03': '3#螺丝拧紧最终角度',
  'maxAngle03': '3#螺丝拧紧最大角度',
  'minAngle04': '4#螺丝拧紧最小角度',
  'actAngle04': '4#螺丝拧紧最终角度',
  'maxAngle04': '4#螺丝拧紧最大角度',
  'minAngle05': '5#螺丝拧紧最小角度',
  'actAngle05': '5#螺丝拧紧最终角度',
  'maxAngle05': '5#螺丝拧紧最大角度',
  'minAngle06': '6#螺丝拧紧最小角度',
  'actAngle06': '6#螺丝拧紧最终角度',
  'maxAngle06': '6#螺丝拧紧最大角度',
  'minAngle07': '7#螺丝拧紧最小角度',
  'actAngle07': '7#螺丝拧紧最终角度',
  'maxAngle07': '7#螺丝拧紧最大角度',
  'minAngle08': '8#螺丝拧紧最小角度',
  'actAngle08': '8#螺丝拧紧最终角度',
  'maxAngle08': '8#螺丝拧紧最大角度',
  'minAngle09': '9#螺丝拧紧最小角度',
  'actAngle09': '9#螺丝拧紧最终角度',
  'maxAngle09': '9#螺丝拧紧最大角度',
  'minAngle10': '10#螺丝拧紧最小角度',
  'actAngle10': '10#螺丝拧紧最终角度',
  'maxAngle10': '10#螺丝拧紧最大角度',
  'minAngle11': '11#螺丝拧紧最小角度',
  'actAngle11': '11#螺丝拧紧最终角度',
  'maxAngle11': '11#螺丝拧紧最大角度',
  'minAngle12': '12#螺丝拧紧最小角度',
  'actAngle12': '12#螺丝拧紧最终角度',
  'maxAngle12': '12#螺丝拧紧最大角度',



  // 电阻测试
  'testResistanceResult01': '安全接地1测试结果',
  'testResistanceResult02': '安全接地2测试结果',
  'testResistanceResult03': '安全接地3测试结果',
  'testDielectricResult': '绝缘电阻测试结果',
  'testHeightVoltageResult': '直流耐压测试结果',

  'testResistance01': '安全接地1电阻值',
  'testResistanceMax01': '安全接地1电阻最大值',
  'testResistanceMin01': '安全接地1电阻最小值',
  'testResistance02': '安全接地2电阻值',
  'testResistanceMax02': '安全接地2电阻最大值',
  'testResistanceMin02': '安全接地2电阻最小值',
  'testResistance03': '安全接地3电阻值',
  'testResistanceMax03': '安全接地3电阻最大值',
  'testResistanceMin03': '安全接地3电阻最小值',

  'testDielectric': '绝缘电阻值',
  'testDielectricMax': '绝缘电阻最大值',
  'testDielectricMin': '绝缘电阻最小值',
  'testDielectricUnit': '绝缘电阻值单位',

  'testHeightVoltage': '耐压测试漏电流值',
  'testHeightVoltageMax': '耐压测试漏电流最大值',
  'testHeightVoltageMin': '耐压测试漏电流最小值',
  'testHeightVoltageUnit': '耐压测试漏电流值单位',

  // 上料相关
  'partLoadResult': '上料结果',
  'partCCDResult': '涂胶相机检测结果',
  'partPlaceInResult': '收板结果',
  'partCCDCheckResult': '上料相机检测结果',

  // 涂胶相关
  'glueHousingResult': '壳体涂胶结果',
  'glueControllerResult': '主控板涂胶结果',
  'gluePhaseResult': '三相盖板涂胶结果',
  'glueWireResult': '低压线束涂胶结果',
  'glueBusbarResult': '母线涂胶结果',
  'housingGlueResult': '工件涂胶结果',
  'glueCCDResult': '涂胶相机检测结果',
  'glueCCDResult01': '涂胶相机检测结果1',
  'glueCCDResult02': '涂胶相机检测结果2',
  'glueCCDResult03': '涂胶相机检测结果3',
  'glueCCDResult04': '涂胶相机检测结果4',
  'glueCCDResult05': '涂胶相机检测结果5',


  // 清洗相关
  'housingPlasmaResult': '壳体等离子清洗结果',
  'controllerPlasmaResult': '主控板等离子清洗结果',
  'phasePlasmaResult': '三相盖板等离子清洗结果',
  'wirePlasmaResult': '低压线束等离子清洗结果',
  'busbarPlasmaResult': '母线等离子清洗结果',
  //气压相关
  "tesFillPressureResult": "水道气密充气结果",
  "testLeakageResult": "水道气密泄露结果",

  "testFillPressureMin": "填充气压最小值",
  "testFillPressureMax": "填充气压最大值",
  'testFillPressure': '填充气压值',
  //水道气密泄露量
  "testLeakageMin": "水道气密泄露量最小值",
  "testLeakageMax": "水道气密泄露量最大值",
  'testLeakage': '水道气密泄露量值',
  // O型圈相关
  'oringCCDResult': 'O型圈相机检测结果'
}

/**
 * 将驼峰命名转换为中文显示名
 * @param {string} fieldName 字段名
 * @returns {string} 中文显示名
 */
function camelToChineseName(fieldName) {
  // 首先检查特殊映射
  if (specialFieldMap[fieldName]) {
    return specialFieldMap[fieldName]
  }

  // 处理数字后缀（如01, 02等）
  const numberMatch = fieldName.match(/(\d+)$/)
  let baseName = fieldName
  let numberSuffix = ''

  if (numberMatch) {
    numberSuffix = `${numberMatch[1]}#`
    baseName = fieldName.replace(/\d+$/, '')
  }

  // 分割驼峰命名
  const words = baseName.split(/(?=[A-Z])/).map(word => word.toLowerCase())

  // 映射每个单词
  const chineseWords = words.map(word => {
    return baseFieldMap[word] || word
  })

  // 组合结果
  let result = chineseWords.join('')

  // 添加数字前缀
  if (numberSuffix) {
    result = numberSuffix + result
  }

  return result || fieldName
}

/**
 * 映射字段名为中文显示名
 * @param {string} fieldName 字段名
 * @returns {string} 中文显示名
 */
export function mapFieldName(fieldName) {
  return camelToChineseName(fieldName)
}

/**
 * 批量映射字段名
 * @param {array} fieldNames 字段名数组
 * @returns {object} 字段名到中文名的映射对象
 */
export function mapFieldNames(fieldNames) {
  const result = {}
  fieldNames.forEach(fieldName => {
    result[fieldName] = mapFieldName(fieldName)
  })
  return result
}

/**
 * 获取所有特殊字段映射
 * @returns {object} 特殊字段映射对象
 */
export function getSpecialFieldMap() {
  return { ...specialFieldMap }
}
